/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.viajaconmigo.web.controladores;

import com.viajaconmigo.model.Pais;
import java.io.Serializable;
import java.util.ArrayList;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import java.util.Date;
import java.util.List;
import javax.faces.model.SelectItem;
import com.viajaconmigo.model.dto.ParDeFechas;
import com.viajaconmigo.web.controladores.util.JSFUtil;
import javax.inject.Inject;
import org.primefaces.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author Pablo
 */
@Named(value = "nuevaPropControl")
@SessionScoped
//@ConversationScoped
public class NuevaPropController extends ParentController implements Serializable {

    private final static Logger logger = LoggerFactory.getLogger(NuevaPropController.class);
    
    //private List<Paisestrad> destinos;
    private List<SelectItem> destinos;
    private List<SelectItem> fechas;
    private List<ParDeFechas> fechasList;
    private Date fechaIni;
    private Date fechaFin;
    private Integer paisToAdd;
    private Short numDiasMax;
    private Short numDiasMin;
    /*private Integer planEco;
     private Integer planOcio;
     private String descriplan;
     private String descriplocio;*/
    private Double costeMin;
    private Double costeMax;
    private String descripcion;
    private Integer destSelect;
    private Integer newDatesEnter;
    private Integer fechasChosen;
    private Boolean viajePublico;

    private Boolean validar = false;
    private String error;
    //private Boolean existeError;

    @Inject
    private UsuarioController usuarioController;

    public NuevaPropController() {
        //destinos = new ArrayList<>();        
        fechas = new ArrayList<>();
        fechasList = new ArrayList<>();
        destinos = new ArrayList<>();
        fechaIni = new Date();
        fechaFin = new Date();
        newDatesEnter = 1;
        viajePublico = true;
        destinos.add(new SelectItem(0, "..."));
        fechas.add(new SelectItem(0, "..."));
        error = "";
    }

    public void listenFechaIniChange() {
        setFechaFin(fechaIni);
        fechaIni = null;
    }

    public void addDestino() {
        try {
            if (paisToAdd != -1) {
                if (destinos.size() == 1 && destinos.get(0).getValue().equals(0)) {
                    destinos.remove(0);
                }
                int i = 0;
                boolean esta = false;
                while (i < destinos.size() && !esta) {
                    if (destinos.get(i).getValue().equals(paisToAdd)) {
                        esta = true;
                    }
                    i++;
                }
                if (!esta) {
                    Pais p = propuestaService.getPais(paisToAdd);
                    /*PaisTrad paisTrad = propuestaService.getPaisTrad(
                            propuestaService.getPais(paisToAdd), idioma);*/
                    destinos.add(new SelectItem(p.getIdPais(),
                            i18nManager.getTraduccion(p, idioma).getLiteral()));
                }
            }
        } catch (RuntimeException e) {
            JSFUtil.createMessageError("", "error_general");
            logger.error("Se he producido un error al obtener el Pais",e);
        }
    }

    public void deletePais() {
        if (destSelect != null) {
            int i = 0;
            boolean fin = false;
            while (i < destinos.size() && !fin) {
                if (destinos.get(i).getValue().equals(destSelect)) {
                    destinos.remove(i);
                    fin = true;
                }
                i++;
            }
            if (destinos.isEmpty()) {
                destinos.add(new SelectItem(0, "..."));
            }
        }
    }

    public void addParFecha() {
        // Eliminar linea en blanco si está
        if (fechas.size() == 1 && fechas.get(0).getValue().equals(0)) {
            fechas.remove(0);
        }
        // Comprobar si las fechas introducidas se solapan con las que hay
        int i = 0;
        boolean solapadas = false;
        while (i < fechasList.size() && !solapadas) {
            if (fechaIni.after(fechasList.get(i).getFechaIni())) {
                if (!fechaIni.after(fechasList.get(i).getFechaFin())) {
                    solapadas = true;
                }
            } else {
                if (!fechaFin.before(fechasList.get(i).getFechaIni())) {
                    solapadas = true;
                }
            }
            i++;
        }
        if (solapadas) {
            //Mostrar error            
            JSFUtil.createMessageError("newproposal:fechas", "date_covered_up");
        } else {
            //Introducir fecha en la lista
            ParDeFechas par = new ParDeFechas(fechaIni, fechaFin);
            fechas.add(new SelectItem(newDatesEnter, par.toString()));
            newDatesEnter++;
            fechasList.add(par);
        }
    }

    public void deleteFecha() {
        //if(fechasSelect != null){
        if (fechasChosen != null) {
            int i = 0;
            boolean fin = false;
            while (i < fechas.size() && !fin) {
                if (fechas.get(i).getValue().equals(fechasChosen)) {
                    fechas.remove(i);
                    fechasList.remove(i);
                    fin = true;
                }
                i++;
            }
            if (fechas.isEmpty()) {
                fechas.add(new SelectItem(0, "..."));
            }
        }
    }

    public void listenNDiasMinChange() {
        numDiasMin = null;
    }

    public void listenCostChange() {
        costeMin = null;
    }

    /*
     public void listenPlanChange (){
     if (planEco == null)
     descriplan = "";
     else{
     for (int i = 0; i<getPlEcoSelect().size(); i++){
     if (getPlEcoSelect().get(i).getValue().equals(planEco))
     descriplan = getPlEcoSelect().get(i).getDescription();
     }
     }
     }
    
     public void listenPlOcioChange (){
     if (planOcio == null)
     descriplocio = "";
     else{
     for (int i = 0; i<getPlOcioSelect().size(); i++){
     if (getPlOcioSelect().get(i).getValue().equals(planOcio))
     descriplocio = getPlOcioSelect().get(i).getDescription();
     }
     }
     }
    
     */
    public void saveProposal() {
        try {
            Integer planEcoAux = planEco;
            if (planEco != null && planEco == 0) {
                planEcoAux = null;
            }
            Integer planOcioAux = planOcio;
            if (planOcio != null && planOcio == 0) {
                planOcioAux = null;
            }
            propuestaService.insertProposal(usuarioController.getUsuario(), (ArrayList) destinos,
                    (ArrayList) fechasList, costeMax, costeMin, numDiasMax, numDiasMin,
                    planEcoAux, planOcio, descripcion, viajePublico);
            RequestContext.getCurrentInstance().execute("dlgSucces.show()");          
        } catch (RuntimeException e) {
            RequestContext.getCurrentInstance().update(
                    "newproposal:dlgError:dialogGrid:errortext");/// ESTO NO FUNCIONA, NO SE MUESTRA EL ERROR EN EL DIALOG
            RequestContext.getCurrentInstance().execute("dlgError.show()");
            logger.error("Se he producido un error al Crear la Propuesta",e);
        }
    }

    public void resetController() {
        fechas = new ArrayList<>();
        fechasList = new ArrayList<>();
        destinos = new ArrayList<>();
        destinos.add(new SelectItem(0, "..."));
        fechas.add(new SelectItem(0, "..."));
        descripcion = "";
        numDiasMax = null;
        numDiasMin = null;
        costeMin = null;
        costeMax = null;
        planEco = 0;
        planOcio = 0;
    }

    public void beginConversation() {
        resetController();
        /*if(conversation.isTransient()){
         resetController();
         conversation.begin();
            
         }*/
    }
    /*
     public void endConversation(){
     if(!conversation.isTransient()){
     conversation.end();
     //   this.clear("panel");
     }
     }
     */

    public void cargaListas() {
        cargaListaPlEco();
        cargaListaPlOcio();
        planEco = 0;
        planOcio = 0;
    }

    @Override
    public void cargaListaPlEco() {
        super.cargaListaPlEco();
        getPlEcoSelect().add(0, new SelectItem(0, JSFUtil.getBundle().getString("no_select")));
        //getPlEcoSelect().
    }

    @Override
    public void cargaListaPlOcio() {
        super.cargaListaPlOcio();
        getPlOcioSelect().add(0, new SelectItem(0, JSFUtil.getBundle().getString("no_select")));

    }

    //Getters and setters
    public List<SelectItem> getFechas() {
        return fechas;
    }

    public void setFechas(List<SelectItem> fechas) {
        this.fechas = fechas;
    }

    public Date getFechaIni() {
        return fechaIni;
    }

    public void setFechaIni(Date fechaIni) {
        this.fechaIni = fechaIni;
    }

    public Date getFechaFin() {
        return fechaFin;
    }

    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    public Integer getPaisToAdd() {
        return paisToAdd;
    }

    public void setPaisToAdd(Integer paisToAdd) {
        this.paisToAdd = paisToAdd;
    }

    public Short getNumDiasMax() {
        return numDiasMax;
    }

    public void setNumDiasMax(Short numDiasMax) {
        this.numDiasMax = numDiasMax;
    }

    public Short getNumDiasMin() {
        return numDiasMin;
    }

    public void setNumDiasMin(Short numDiasMin) {
        this.numDiasMin = numDiasMin;
    }
    /*
     public Integer getPlanEco() {
     return planEco;
     }

     public void setPlanEco(Integer planEco) {
     this.planEco = planEco;
     }

     public Integer getPlanOcio() {
     return planOcio;
     }

     public void setPlanOcio(Integer planOcio) {
     this.planOcio = planOcio;
     }

     public String getDescriplan() {
     return descriplan;
     }

     public void setDescriplan(String descriplan) {
     this.descriplan = descriplan;
     }

     public String getDescriplocio() {
     return descriplocio;
     }

     public void setDescriplocio(String descriplocio) {
     this.descriplocio = descriplocio;
     }
     */

    public Double getCosteMin() {
        return costeMin;
    }

    public void setCosteMin(Double costeMin) {
        this.costeMin = costeMin;
    }

    public Double getCosteMax() {
        return costeMax;
    }

    public void setCosteMax(Double costeMax) {
        this.costeMax = costeMax;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public List<SelectItem> getDestinos() {
        return destinos;
    }

    public void setDestinos(List<SelectItem> destinos) {
        this.destinos = destinos;
    }

    public Integer getDestSelect() {
        return destSelect;
    }

    public void setDestSelect(Integer destSelect) {
        this.destSelect = destSelect;
    }

    public Integer getFechasChosen() {
        return fechasChosen;
    }

    public void setFechasChosen(Integer fechasChosen) {
        this.fechasChosen = fechasChosen;
    }

    public Boolean getViajePublico() {
        return viajePublico;
    }

    public void setViajePublico(Boolean viajePublico) {
        this.viajePublico = viajePublico;
    }

    public Boolean getValidar() {
        return validar;
    }

    public void setValidar(Boolean validar) {
        this.validar = validar;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }

}
